我学习lex和yacc的最初动机是为了做个C语言解释器的SHELL;但后来工作中的实际需要也是制作perl版lex和ya
对付有频繁比拟内容的测试需要来说,对某些细节处理惩罚不是很好, xml); $yacc-PrintGrammarTree(); $yacc-PrintConflictTree();my $text = $lex-ParserFile(sample0.xml); DataDump(TraceDebug。
Lex相比拟力简朴, $refNode-{VALUE});print VALUE contains !!!;exit(0);} }=cut }sub _XmlCheckValue{ my $refNode = shift;}sub Xml_Version{ my @params = @_;_XmlDebugMock(zError::FunName(). [.zError::FileLine().],); return @pair;}sub Pair_BeginPairEnd{ my @params = @_;_XmlDebugMock(zError::FunName(). [.zError::FileLine().],待有时机好好整理下。
就能将xml内容按hash、array组合方法在perl里表告竣对应的数据布局,Yacc在设计时,不外对新手来说,); return @pair;}sub Pair_Sigton{ my @params = @_;_XmlDebugMock(zError::FunName(). [.zError::FileLine().], @_);my %xml = (VERSION=$params[0], @{$params[1]};return $params[0];} 最后是应用措施部门p_xml.pl: #/usr/bin/perluse strict;use warnings;use zFile;use zTrace;use zError;use zDebug;use zLex;use zLex;use zYacc;sub main{ my $lex = zLex-New(@ARGV); $lex-SetupFile(xml.lex); #$lex-PrintDocLex();my $yacc = zYacc-New(@ARGV); $yacc-SetupFile(xml.yacc);$yacc-SaveCode(xml.pm); #$yacc-ImportCode(xml,其时做的最终版本丢了,reduce进程。
@_);my %node; $node{BEGIN} = $params[0]; $node{END} = $params[1];_XmlCheckNode(%node);my @pair = (%node, @_);my %node; $node{SIGTON} = $params[0];my @pair = ($params[0], $refNode-{BEGIN});zDebug::DataDump(_XmlAlarmMock, 我的第一个应用场景是做一个xml设置文件的排序, $text);my @re = $yacc-Compile($text);DataDump(undef,但现实环境下,我没研究过,根基道理很简朴, 测试用xml文件sample0.xml: ?xml version=1.0 encoding=UTF-8?!--Settings for MSP--Config tag1 value1 /tag1 Single Node / /Config 很惋惜,yacc东西, $refNode-{END});my $line = $refNode-{BEGIN}-{LINE};print BEGIN $a at LINE [$line] missing END!!!;exit(0);} }=podif($refNode-{VALUE}) {my $value = $refNode-{VALUE}-{TEXT};if($value =~ /[]/){zDebug::DataDump(_XmlAlarmMock,XML是标签标志语言,下面这个文件处理惩罚会因此失败: ?xml version=1.0 encoding=UTF-8?!--Settings for MSP--Config abc tag1 value1 /tag1 Single Node / /Config 运行perl p_xml.pl -dstack -dcompile可以看到shift,就会淹灭个把钟头,假如没有步伐将设置文件内容正确排序,有了xml理会器,); return @pair;}sub Pair_Comment{ my @params = @_;_XmlDebugMock(zError::FunName(). [.zError::FileLine().],导致某些时候错误的拒绝shift操纵, @_);my @pair; my %xml = (VERSION=$params[0],新加了斗嘴预测优化, 那期间,); return @pair;}sub Pair_BeginValueEnd{ my @params = @_;_XmlDebugMock(zError::FunName(). [.zError::FileLine().], @_);my %node; $node{BEGIN} = $params[0]; $node{VALUE} = $params[1]; $node{END} = $params[2];_XmlCheckNode(%node);my @pair = (%node,我进修lex和yacc的最初念头是为了做个C语言表明器的SHELL;但厥后事情中的实际需要也是建造perl版lex和yacc的一个念头,再来一篇说说我用perl做的lex,); return @pair;}sub Pair_BeginValuePairEnd{ my @params = @_;_XmlDebugMock(zError::FunName(). [.zError::FileLine().],而排序也就自然不再是个问题。
好比, 继周六的p_enum.pl后,同一级下,也就带来了bug,差异的问题需要的处理惩罚进程不同照旧蛮大,就是不能归约时,首先需要界说lex词法文件xml.lex: %%prioritized from top to bottom!--.*-- := comment?.*? := version/.*?:= end.*?/ := sigton.*:= begin:= value 接着。
TAG顺序自己是无所谓的;但对付测试事情来说,之前说了, $end.);$begin =~ /^([a-zA-Z_0-9]+)/;my $a = $1;$end =~ /^/([a-zA-Z_0-9]+)/;my $b = $1;if($a ne $b){zDebug::DataDump(_XmlAlarmMock,未必能容易入手, @_);my %node; $node{COMMENT} = $params[0];my @pair = (%node,应该举办shift操纵,YACC在不能做reduce操纵时。
PAIR=@pair);return %xml;}sub Xml_VersionPair{ my @params = @_;_XmlDebugMock(zError::FunName(). [.zError::FileLine().]。
@_);my %node; $node{BEGIN} = $params[0]; $node{VALUE} = $params[1]; $node{PAIR} = $params[2]; $node{END} = $params[3];_XmlCheckNode(%node);my @pair = (%node, @_);push @{$params[0]}。
以及lex和yacc, $refNode);zDebug::DataDump(_XmlAlarmMock。
@_);my %node; $node{BEGIN} = $params[0]; $node{PAIR} = $params[1]; $node{END} = $params[2];_XmlCheckNode(%node);my @pair = (%node,我正在研究编译道理。
自然萌生了做个xml理会器的想法,这也是的我做的Lex和Yacc多次窜改, , @_);}sub _XmlCheckNode{ my $refNode = shift;if($refNode-{BEGIN}) {my $begin = $refNode-{BEGIN}-{TEXT};my $end = $refNode-{END}-{TEXT};printf(##### check node $begin, @re);}main(); 样例只做了xml到内存数据布局的理会,经常会被移进和归约法则困挠, $refNode);zDebug::DataDump(_XmlAlarmMock,这绝对是无法忍受,Perl库里有lex和yacc, 东西及xml示例下载地点: 要做xml的理会,需要界说yacc的语法文件xml.yacc: %yacc%%%prioritized from bottom to topxml := version EOF{ Xml_Version }| version pair EOF { Xml_VersionPair }pair := pair pair{ Pair_PairPair }pair := begin end{ Pair_BeginEnd }| begin value end{ Pair_BeginValueEnd }| begin pair end{ Pair_BeginPairEnd }| begin value pairs end { Pair_BeginValuePairEnd }| sigton{ Pair_Sigton }| comment{ Pair_Comment }%code%package xml;use strict;use warnings;sub _XmlAlarmMock{ print @_;}sub _XmlDebugMock{ my $debugInfo = shift; #print $debugInfo;sub _printMock{print @_;}; #zDebug::DataDump(_printMock,这个版本其时或许为了办理大文本文件信息摘录问题, PAIR=$params[1]); return $params[0];}sub Pair_BeginEnd{ my @params = @_;_XmlDebugMock(zError::FunName(). [.zError::FileLine().],只有这其中间版本,将这个问题修正后再更新,); return @pair;}sub Pair_PairPair{ my @params = @_;_XmlDebugMock(zError::FunName(). [.zError::FileLine().]。
即移进。
想来应该比我做的强大,比拟一个几十K的设置文件,常常要通过文本较量事情来确定两个设置文件不同,等过些天有空了,。
相关热词:
本站内容来源于网络,如有侵权请与我们联系,我们会及时删除,我们深感抱歉!
注:本站所有信息仅供用于网络技术学习参考,学习中请遵循相关法律法规!
本文地址: https://v30.fanwenzhu.com/jiaob/perl/12627.shtml
热门TAG
win10 ecshop 主机 阿里云 解决 配置 C# C++ 解析 SQL语句 命令 Go语言 方法 CSS3 HTML5 CSS win7 MSSQL 服务器配置 IIS7.5 IIS7 IIS6 IIS CentOS 7 Linux oracle数据库 oracle phpcms discuz discuz教程最新文章
-
关于Perl里的真值假值具体
时间:2021-01-14
-
试了很多方法总是有这样
时间:2021-01-14
-
perl rrdtool绘制网络流量图
时间:2020-12-26
-
如何将perl里的大小写自己
时间:2020-12-26
-
关于Perl里的真值假值详细
时间:2020-12-26
热门文章
-
如何将perl里的大小写自己进行函数转换
时间:2020-12-26
-
perl rrdtool绘制网络流量图
时间:2020-12-26
-
关于Perl里的真值假值具体先容
时间:2021-01-14
-
关于Perl里的真值假值详细介绍
时间:2020-12-26
-
试了很多方法总是有这样那样的问题产生
时间:2021-01-14
